package lib

import (
	"fmt"
	"os"
	"strings"

	"github.com/BurntSushi/toml"
	"github.com/spf13/viper"
)

// 配置文件语法类型
const configType = "toml"

var ConfEnvPath string //配置文件夹
var ConfEnv string     //配置环境名 比如：dev prod test

// 解析配置文件路径到 ConfEnvPath、ConfEnv 两个包变量中
//
// 配置文件必须放到一个文件夹中
// 如：config=conf/dev/base.json 	ConfEnvPath=conf/dev	ConfEnv=dev
// 如：config=conf/base.json		ConfEnvPath=conf		ConfEnv=conf
func ParseConfPath(config string) error {
	path := strings.Split(config, "/")
	prefix := strings.Join(path[:len(path)-1], "/")
	ConfEnvPath = prefix
	ConfEnv = path[len(path)-2]
	return nil
}

// 获取配置环境名
func GetConfEnv() string {
	return ConfEnv
}

// 组合环境+文件名+文件后缀
func GetConfPath(fileName string) string {
	return ConfEnvPath + "/" + fileName + "." + configType
}

func GetConfFilePath(fileName string) string {
	return ConfEnvPath + "/" + fileName
}

// 本地解析文件
func ParseLocalConfig(fileName string, st interface{}) error {
	path := GetConfFilePath(fileName)
	err := ParseConfig(path, st)
	if err != nil {
		return err
	}
	return nil
}

// 借用 viper 把指定配置文件中的内容映射到 conf 结构体上，
func ParseConfig(path string, conf interface{}) error {
	file, err := os.Open(path)
	if err != nil {
		return fmt.Errorf("open config %v fail, %v", path, err)
	}

	v := viper.New()
	v.SetConfigType(configType)
	v.ReadConfig(file)
	if err := v.Unmarshal(conf); err != nil {
		return fmt.Errorf("parse config fail, config:%v, err:%v", path, err)
	}
	return nil
}

// 使用 toml 包解析配置文件到 conf 结构体上
func ParseConf(path string, conf interface{}) (err error) {
	_, err = toml.DecodeFile(path, &conf)
	return
}
